/**
 *  深圳南瑞103标准协议，读取定值信息接口
 * */

#ifndef SZNR103CLIENT_H
#define SZNR103CLIENT_H


#include <CommBase.h>
#include "SZNRConnection.h"
#include "SZNR103Parser.h"
#include <QWidget>
#include <QObject>

#define ITIME_ASK1L 600 // 1级轮询间隔 1秒
#define PARSE_TIME 6000 // 预计从开始通信到解析完所有结果耗时

class SZNR103Client : public QObject , public CommBase {
    Q_OBJECT
public:
    explicit SZNR103Client(QObject *parent = nullptr);
    ~SZNR103Client();

    // 连接设备, 用户输入参数，通信参数
    void connectDevice(QString devAddr, QString localAddr, QString devPort, QString localPort = nullptr) override;

    // 读取定值, 一键处理读取所有定值有关的信息,并存入结构体变量，随时供外部查看 , 由外部用户启动
    void readDeviceAll() override;

    // 供外部查看数据
    void  getAllBillInfo(QMap<QString, BillTableStruct> &) override;

    //断开连接
    void disConnectDevice() override;

    void showTable() override;

    void setBillGroup(QStringList& ) override;     // 设置定值组有关的组号，报文发送时候需要根据组号来，标准以太网103无法获取到组号信息

    QStringList getErrorLog() override;

private slots:
    void slot_afterConnected(); // 当连接成功后，接到用户需要读取保护数据的请求执行

    void slot_sendRequestILevelData();

    void slot_toReadCMD();

    void slot_recvMsg();

    void slot_recvNoDataResponseFrame();    // 接收到保护发送的 无数召唤的数据响应帧，需要停掉1级数据召唤

    void slot_retryPrevCmd();   //尝试重复上一次命令

    void slot_getBillInfo();    // 获取结果的定时器槽函数

private:
    SZNRConnection *m_connection;
    SZNR103Constructer m_constructer;
    SZNR103Parser m_parser;

    QString m_devAddr;  // 设备地址
    QString m_devPort;  // 设备端口号
    QString m_localAddr;    // 本地地址
    QString m_localPort;    // 本地端口号，标准协议无需使用
    QByteArray m_cpuAddr;  // cpu 服务地址 01

    QStringList m_errorList;      // 错误记录

    QTimer m_timerReadDeviceRequest;    // 当接口使用的时候，避免单次调用readAll接口，但是连接未成功就读，启动定时器检查连接状态，ok就开始读
    bool  isCanComminucate;     // 是否可以开始和保护通讯交互，在连接成功后置 true

   // QTimer m_timerSendRequestLevel;     // 1级数据存在多次请求，需要收到保护回的再无数据信号，再停止1级数据请求

    QByteArray m_prevCmd;   //当前发出的命令，备着需要重新发送的时候使用

    QTimer m_timerGetParseResult;   // 延迟6s（预计需要耗时）， 单次触发， 在用户点击读取后启动， 超时就初始化m_tablesInfo

    QMap<QString, BillTableStruct> m_tablesInfo;

    // 强制设置定值组组号
    QStringList m_billGroupNo;  // 定值组组号，02 ，03
};

#endif // SZNR103CLIENT_H
